]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
St: don't focus hidden actors
authorGiovanni Campagna <gcampagna@src.gnome.org>
Thu, 6 Sep 2012 20:12:44 +0000 (22:12 +0200)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 10 Sep 2012 19:23:25 +0000 (21:23 +0200)
If an actors is not mapped (visible and all parents visible), then don't
allow navigating focus to it.
This fixes a regression in the keyboard navigation of the panel with
invisibile items.

https://bugzilla.gnome.org/show_bug.cgi?id=683529

src/shell-stack.c
src/st/st-bin.c
src/st/st-entry.c
src/st/st-widget.c

index 55d5d03afda96fc3ef9acbec756cd1fd913df09a..c75aae8a4df850455660ba63c51bffdb478c6098 100644 (file)
@@ -155,8 +155,15 @@ shell_stack_navigate_focus (StWidget         *widget,
       if (from && clutter_actor_contains (CLUTTER_ACTOR (widget), from))
         return FALSE;
 
-      clutter_actor_grab_key_focus (CLUTTER_ACTOR (widget));
-      return TRUE;
+      if (CLUTTER_ACTOR_IS_MAPPED (CLUTTER_ACTOR (widget)))
+        {
+          clutter_actor_grab_key_focus (CLUTTER_ACTOR (widget));
+          return TRUE;
+        }
+      else
+        {
+          return FALSE;
+        }
     }
 
   top_actor = clutter_actor_get_last_child (CLUTTER_ACTOR (widget));
index 3bfa93d87463b1bd5f3fe123d4c74c9c2545907f..a2a67bb317ca8aac55189f39b87c5e1e8fa7d1a7 100644 (file)
@@ -200,8 +200,15 @@ st_bin_navigate_focus (StWidget         *widget,
       if (from && clutter_actor_contains (bin_actor, from))
         return FALSE;
 
-      clutter_actor_grab_key_focus (bin_actor);
-      return TRUE;
+      if (CLUTTER_ACTOR_IS_MAPPED (bin_actor))
+        {
+          clutter_actor_grab_key_focus (bin_actor);
+          return TRUE;
+        }
+      else
+        {
+          return FALSE;
+        }
     }
   else if (priv->child && ST_IS_WIDGET (priv->child))
     return st_widget_navigate_focus (ST_WIDGET (priv->child), from, direction, FALSE);
index e4c35a286ebce854eba0bf952a1100f33550b083..c6b8701f84fcab4e2e925cd4dca8c3d8dec0209c 100644 (file)
@@ -284,7 +284,8 @@ st_entry_navigate_focus (StWidget         *widget,
 
   if (from == priv->entry)
     return FALSE;
-  else if (st_widget_get_can_focus (widget))
+  else if (st_widget_get_can_focus (widget) &&
+           CLUTTER_ACTOR_IS_MAPPED (priv->entry))
     {
       clutter_actor_grab_key_focus (priv->entry);
       return TRUE;
index 717268abb8469606e7f0d969fadfc088f872b506..c867f7d446a72ee83244ce7cbc20ebf69fd53616 100644 (file)
@@ -763,18 +763,7 @@ st_widget_get_paint_volume (ClutterActor *self,
 static GList *
 st_widget_real_get_focus_chain (StWidget *widget)
 {
-  ClutterActorIter iter;
-  ClutterActor *child;
-  GList *focus_chain = NULL;
-
-  clutter_actor_iter_init (&iter, CLUTTER_ACTOR (widget));
-  while (clutter_actor_iter_next (&iter, &child))
-    {
-      if (CLUTTER_ACTOR_IS_VISIBLE (child))
-        focus_chain = g_list_prepend (focus_chain, child);
-    }
-
-  return g_list_reverse (focus_chain);
+  return clutter_actor_get_children (CLUTTER_ACTOR (widget));
 }
 
 
@@ -1898,9 +1887,17 @@ st_widget_real_navigate_focus (StWidget         *widget,
     {
       if (!focus_child)
         {
-          /* Accept focus from outside */
-          clutter_actor_grab_key_focus (widget_actor);
-          return TRUE;
+          if (CLUTTER_ACTOR_IS_MAPPED (widget_actor))
+            {
+              /* Accept focus from outside */
+              clutter_actor_grab_key_focus (widget_actor);
+              return TRUE;
+            }
+          else
+            {
+              /* Refuse to set focus on hidden actors */
+              return FALSE;
+            }
         }
       else
         {